package com.oyjd.beauty.business.goodsType.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.oyjd.beauty.bean.po.GoodsType;
import com.oyjd.beauty.bean.vo.GoodsTypeVO;
import com.oyjd.beauty.business.goodsType.dao.GoodsTypeDao;
import com.oyjd.beauty.business.goodsType.service.GoodsTypeService;
import com.oyjd.beauty.fw.action.Page;

/**
 * 
 * 商品分类业务接口实现
 * 
 * @author <b>欧建东<br/>
 *         Email:oyjd@163.com</b>
 * @version 1.0
 */
@Component
@Transactional(readOnly = true)
public class GoodsTypeServiceImpl implements GoodsTypeService {
	private GoodsTypeDao dao;

	@Autowired
	public void setDao(GoodsTypeDao dao) {
		this.dao = dao;
	}

	/**
	 * 获取商品分类列表数据
	 * 
	 * @param page
	 *            页面对象
	 * @return
	 */
	public Page<GoodsTypeVO> getList(Page<GoodsTypeVO> page) {
		return dao.getList(page);
	}

	/**
	 * 根据ID获取商品分类对象信息
	 * 
	 * @param id
	 *            ID
	 * @return
	 */
	public GoodsTypeVO getGoodsTypeVO(String goodsTypeId) {
		return dao.getGoodsTypeVO(goodsTypeId);
	}

	/**
	 * 增加商品分类
	 * 
	 * @param pid
	 *            父节点
	 * @param name
	 *            名称
	 * @param note
	 *            描述
	 * @param user
	 *            当前用户
	 */
	@Transactional(readOnly = false)
	public void add(String pid, String name, String note, String user) {
		Date date = new Date();
		GoodsType goodsType = new GoodsType();
		goodsType.setPid(pid);
		goodsType.setName(name);
		goodsType.setNote(note);
		goodsType.setCreator(user);
		goodsType.setCreateTime(date);
		goodsType.setLastEditor(user);
		goodsType.setLastUpdateTime(date);
		goodsType.setStatus(0);
		dao.create(goodsType);
	}

	/**
	 * 修改商品分类
	 * 
	 * @param goodsTypeId
	 *            商品类ID
	 * @param pid
	 *            父节点
	 * @param name
	 *            名称
	 * @param note
	 *            描述
	 * @param user
	 *            当前用户
	 */
	@Transactional(readOnly = false)
	public void edit(String goodsTypeId, String pid, String name, String note, String user) {
		Date date = new Date();
		GoodsType goodsType = (GoodsType) dao.queryById(GoodsType.class, goodsTypeId);
		goodsType.setGoodsTypeId(goodsTypeId);
		goodsType.setPid(pid);
		goodsType.setName(name);
		goodsType.setNote(note);
		goodsType.setLastEditor(user);
		goodsType.setLastUpdateTime(date);
		dao.update(goodsType);
	}

	/**
	 * 删除商品分类
	 * 
	 * @param ids
	 *            多个ID
	 * @param user
	 *            当前用户
	 * @return
	 */
	@Transactional(readOnly = false)
	public void remove(String[] ids, String user) {
		dao.remove(ids, user);
	}

	/**
	 * 获取树结构数据
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public JSONArray getTypeTree() {
		List<GoodsType> list = (List<GoodsType>) dao.queryByHql("from " + GoodsType.class.getName() + " where status=0");
		return getLevelByPid(list, "");
	}

	/**
	 * 获取一个节点下所有子节点形成的JSONArray
	 * 
	 * @param sou
	 * @param parentId
	 * @return
	 */
	private static JSONArray getLevelByPid(List<GoodsType> sou, String id) {
		JSONArray result = new JSONArray();
		for (GoodsType q : sou) {
			if (id.equals(q.getPid())) {
				JSONObject jobj = new JSONObject();
				jobj.put("id", q.getGoodsTypeId());
				jobj.put("text", q.getName());
				JSONObject att = new JSONObject();
				att.put("pid", q.getPid());
				att.put("note", q.getNote());
				jobj.put("attributes", att);
				JSONArray tmp = getLevelByPid(sou, q.getGoodsTypeId());
				if (tmp.size() > 0) {
					jobj.put("children", tmp);
				}
				result.add(jobj);
			}
		}
		return result;
	}

	/**
	 * 获取类型下拉选择数据
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<GoodsTypeVO> getSelectType() {
		List<GoodsType> list = (List<GoodsType>) dao.queryByHql("from " + GoodsType.class.getName() + " where status=0");
		return doSelectType(list, "", 0);
	}

	/**
	 * 获取一个节点下所有子节点形成的id->选择的节点
	 * 
	 * @param sou
	 * @param parentId
	 * @return
	 */
	private static List<GoodsTypeVO> doSelectType(List<GoodsType> sou, String id, int level) {
		List<GoodsTypeVO> result = new ArrayList<GoodsTypeVO>();
		int count = 1;
		for (GoodsType g : sou) {
			if (id.equals(g.getPid())) {
				GoodsTypeVO vo = new GoodsTypeVO();
				vo.setGoodsTypeId(g.getGoodsTypeId());
				if (0 == level) {
					vo.setName("-----" + g.getName() + "-----");
				} else if (1 == level) {
					vo.setName(count++ + "-" + g.getName());
				}
				vo.setPid(g.getPid());
				result.add(vo);
				List<GoodsTypeVO> son = doSelectType(sou, g.getGoodsTypeId(), level + 1);
				if (son.size() > 0) {
					result.addAll(son);
				}
			}
		}
		return result;
	}
}
